﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
using Microsoft.AspNet.Identity.Owin;
using Owin;
using CorreoSocialWeb.Models;

using Subgurim.Controles;
using Subgurim.Controles.GoogleChartIconMaker;
using CorreoSocialWeb.Controls;


namespace CorreoSocialWeb.Views
{
    public class FormViewEnvioControlHelper : ControlHelper, IEnvioFormEditFields
    {
        EditarEnvioUserControl Control { get; set; }

        protected override Control ParentControl
        {
            get { return this.Control.PanelForm; }
        }

        public FormViewEnvioControlHelper(EditarEnvioUserControl control)
            : base(control)
        {
            this.Control = control;
        }

        public string Origen
        {
            get
            {
                return this.FindControl<TextBox>("Origen").Text;
            }
        }

        public string Destino
        {
            get
            {
                return this.FindControl<TextBox>("Destino").Text;
            }
        }

        public int? HoraDeLlegada
        {
            get
            {
                var text = this.FindControl<TextBox>("HoraDeLlegada").Text.Trim();

                if (text == string.Empty)
                    return null;

                return int.Parse(text);
            }
        }

        public int? MinutosDeLlegada
        {
            get
            {
                return new MinutoValidator().Get(this.MinutosDeLlegadaString);
            }
        }

        public string MinutosDeLlegadaString
        {
            get
            {
                return this.FindControl<TextBox>("MinutosDeLlegada").Text;
            }
        }

        public int? HoraDeSalida
        {
            get
            {
                return new HoraValidator().Get(this.FindControl<TextBox>("HoraDeSalida").Text);
            }
        }

        public int? MinutosDeSalida
        {
            get
            {
                return new MinutoValidator().Get(this.FindControl<TextBox>("MinutosDeSalida").Text);
            }
        }

        public int TamanoDePaqueteId
        {
            get
            {
                return int.Parse(this.FindControl<DropDownList>("TamanoDePaquete").SelectedValue);
            }
        }

        public string FechaDeSalidaString
        {
            get
            {
                return this.FindControl<TextBox>("FechaDeSalida").Text.Trim();
            }
        }

        public DateTime? FechaDeSalida
        {
            get
            {
                var text = this.FechaDeSalidaString;

                if (text == string.Empty)
                    return null;
                
                return DateTime.Parse(text, new System.Globalization.CultureInfo("es-ar"));
            }
        }

        public string Notas
        {
            get
            {
                var text = this.FindControl<TextBox>("Notas").Text.Trim();

                if (text == string.Empty)
                    return null;

                return text;
            }
        }

        public bool SinOrigen
        {
            get
            {
                return string.IsNullOrWhiteSpace(this.Origen);
            }
        }

        public bool SinDestino
        {
            get
            {
                return string.IsNullOrWhiteSpace(this.Destino);
            }
        }

        public bool SinTamanioDePaquete
        {
            get
            {
                return this.TamanoDePaqueteId < 1;
            }
        }

        public bool HoraDeSalidaInvalida
        {
            get
            {
                return 
                    !string.IsNullOrWhiteSpace(this.HoraDeSalidaString) &&
                    !(new HoraValidator().Validate(this.HoraDeSalidaString))
                    ||
                    !string.IsNullOrWhiteSpace(this.MinutosDeSalidaString) &&
                    !(new MinutoValidator().Validate(this.MinutosDeSalidaString));
            }
        }

        public string HoraDeSalidaString
        {

            get
            { 
                return this.FindControl<TextBox>("HoraDeSalida").Text;
            }
        }

        public string HoraDeLlegadaString
        {

            get
            {
                return this.FindControl<TextBox>("HoraDeLlegada").Text;
            }
        }

        public bool MinutosDeSalidaInvalidos
        {
            get
            {
                return !(new MinutoValidator().Validate(this.MinutosDeSalidaString));
            }
        }

        public string MinutosDeSalidaString
        {
            get
            {
                return this.FindControl<TextBox>("MinutosDeSalida").Text;
            }
        }

        public bool HoraDeLlegadaInvalida
        {
            get
            {
                return
                       !string.IsNullOrWhiteSpace(this.HoraDeLlegadaString) &&
                    !(new HoraValidator().Validate(this.HoraDeLlegadaString))
                    ||
                    !string.IsNullOrWhiteSpace(this.MinutosDeLlegadaString) &&
                    !(new MinutoValidator().Validate(this.MinutosDeLlegadaString));
            }
        }

        public bool FechaDeSalidaInvalida
        {
            get
            {
                DateTime dummy;

                var invalida = !string.IsNullOrWhiteSpace(this.FechaDeSalidaString)
                    &&
                    !DateTime.TryParse(this.FechaDeSalidaString, new System.Globalization.CultureInfo("es-AR")
                    , System.Globalization.DateTimeStyles.None , out dummy);

                if (invalida)
                    return invalida;

                return this.FechaDeSalida < DateTime.Now.Date;
            }
        }

        public bool Validar(ErroresHelper errores)
        {
            if (this.SinOrigen)
                errores.Add("Especificá el Nombre del Origen.", this.Control.LabelErrorOrigen);

            if (this.SinDestino)
                errores.Add("Especificá el Nombre del Destino.\n", this.Control.LabelErrorDestino);

            if (this.SinTamanioDePaquete)
                errores.Add("Especificá el Tamaño de Paquete.\n", this.Control.LabelErrorTamanoDePaquete);

            if (this.HoraDeSalidaInvalida)
                errores.Add("Horario de Salida Inválido\n", this.Control.LabelErrorHoraDeSalida);

            if (this.HoraDeLlegadaInvalida)
                errores.Add("Horario de Llegada inválido.\n", this.Control.LabelErrorHorarioDeLlegada);

            if (this.FechaDeSalidaInvalida)
                errores.Add("Fecha de Salida inválida.\n", this.Control.LabelErrorFechaDeSalida);

            if (this.CoordenadasDeSesion.SinOrigen)
                errores.Add("Especificá el Punto Origen en el Mapa.\n", this.Control.LabelErrorCoordenadaOrigen);

            if (this.CoordenadasDeSesion.SinDestino)
                errores.Add("Especificá el Punto Destino en el Mapa.\n", this.Control.LabelErrorCoordenadaDestino);

            return !errores.HayErrores;
        }
    }
}